Análise do Jogo de Imagens aplicadas no Ensino médio

Amostra dos dados da pesquisa realizada

Tabulação do número de acertos dos itens do jogo de imagens.

Coluna Descrição
Exoticas Número de acertos dentre todas as imagens exibidas do tipo exótica, valor experado é 5.
Nativas Número de acertos dentre todas as imagens exibidas do tipo nativa, valor experado é 5.
head(pos_gabarito$dados, 10)

Determinado a taxa de percepção

Entende-se por taxa de percepção o fator determinado pela quantidade média de acertos dentre as questões apresentadas aos alunos, em relação a turma em que o questionario foi aplicado.

Percepção dos alunos

print(pos_gabarito$percentual_acerto)

Entendendo a distribuição das médias

Níveis de reconhecimento (acertos) por tipo de origem dos animais

grid.arrange(
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_nome_exoticas,
                  pos_gabarito$percentual_acerto$p_nome_nativas,
                  "Identificação dos nomes"),
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_origem_exoticas,
                  pos_gabarito$percentual_acerto$p_origem_nativas,
                  "Identificação das origens", y = ""),
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_indice_exoticas,
                  pos_gabarito$percentual_acerto$p_indice_nativas,
                  "Taxa de reconhecimento", y = ""), 
    ncol = 3,
    top = textGrob("Niveis de reconhecimento por origem\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    right = "\n"
)

Diferença de acertos

grid.arrange(
    ggplot(pos_gabarito$dados, aes(exoticas - nativas)) +
        geom_histogram(bins = 10) +
        scale_y_continuous(limits = c(0,130)) +
        scale_x_continuous(limits = c(-5,5)) +
        labs(title = "Identificação dos nomes", y = "Total de acertos") +
        my_theme,
    ggplot(pos_gabarito$dados, aes(origem_exoticas - origem_nativas)) +
        geom_histogram(bins = 10) +
        #geom_density(fill = "red") +
        scale_y_continuous(limits = c(0,130)) +
        scale_x_continuous(limits = c(-5,5)) +
        labs(title = "Identificação das origens", y = "") +
        my_theme,
    ggplot(pos_gabarito$dados, aes(indice_exoticas - indice_nativas)) +
        geom_histogram(bins = 10, fill = "darkblue") +
        scale_y_continuous(limits = c(0,130)) +
        scale_x_continuous(limits = c(-5,5)) +
        labs(title = "Taxa de reconhecimento", y = "") +
        my_theme, 
    ggtexttable(normalidade(pos_gabarito$dados$exoticas - pos_gabarito$dados$nativas),
                rows = NULL, theme = ttheme(base_style = "mOrange", base_size = 9)),
    ggtexttable(normalidade(pos_gabarito$dados$origem_exoticas - pos_gabarito$dados$origem_nativas),
                rows = NULL, theme = ttheme(base_style = "mOrange", base_size = 9)),
    ggtexttable(normalidade(pos_gabarito$dados$indice_exoticas - pos_gabarito$dados$indice_nativas),
                rows = NULL, theme = ttheme(base_style = "mOrange", base_size = 9)),
    ncol = 3,
    top = textGrob("Histograma das diferenças Exoticas x Nativas\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    heights=c(3/4, 1/4),
    right = "\n",
    bottom = "\n"
)

Grupos taxonómicos

rbind(
    cbind(grupo = "Aves", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_aves))),
    cbind(grupo = "Aves", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_aves))),
    cbind(grupo = "Invertebrados", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_invertebrado))),
    cbind(grupo = "Invertebrados", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_invertebrado))),
    cbind(grupo = "Mamiferos", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_mamifero))),
    cbind(grupo = "Mamiferos", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_mamifero))),
    cbind(grupo = "Peixes", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_peixe))),
    cbind(grupo = "Peixes", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_peixe))),
    cbind(grupo = "Répteis", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_reptil))),
    cbind(grupo = "Répteis", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_reptil)))
) %>%
        ggplot(aes(x=Var1, y = Freq, fill = origem)) + 
        geom_bar(stat="identity", width=.5, position = "dodge") +
        facet_wrap(~grupo, scales = "free") + 
        labs(title = "Percentual de acerto x grupos taxonomicos\n", 
             y = "Frequencia", x = "Percentual de acerto") +
        my_theme

cidade1 <- pos_gabarito$percentual_acerto[pos_gabarito$percentual_acerto$municipio == "Silvânia",]
cidade2 <- pos_gabarito$percentual_acerto[pos_gabarito$percentual_acerto$municipio == "Bela Vista de Goiás",]
grid.arrange(
    plotAnaliseMedias(
        cidade1$p_indice_exoticas,
        cidade1$p_indice_nativas,
        "Silvânia"),
    plotAnaliseMedias(
        cidade2$p_indice_exoticas,
        cidade2$p_indice_nativas,
        "Bela Vista de Goiás", ytext = ""),
    ncol = 2,
    top = textGrob("Niveis de reconhecimento por origem\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    right = "\n"
)

Medindo as médias de acerto na identificação do nome das espécies

# pos_gabarito$percentual_acerto %>%
#     group_by(municipio) %>%
#     summarise(exoticas = mean(p_indice_exoticas),
#               nativas = mean(p_indice_nativas)) %>%
#     ungroup() %>%
#     melt(id = "municipio") %>%
#     ggplot(aes(municipio, value, fill = variable)) +
#     facet_wrap(~variable)+
#     geom_point(show.legend = F) +
#     geom_errorbar(aes(ymin = ic.media(variable)$error_inferior, ymax = ic.media(variable)$error_superior )) +
#     labs(title = "Média de taxa de reconhecimento das origens exóticas por municipio\n",
#          x = "", y = "Percentual médio de acerto\n") +
#     my_theme
# barplot(tapply(
#     pos_gabarito$percentual_acerto$p_indice_exoticas, 
#     pos_gabarito$percentual_acerto$municipio,
#     mean), main = "Média de taxa de reconhecimento das origens exóticas por areas")
# barplot(tapply(
#     pos_gabarito$percentual_acerto$p_indice_exoticas, 
#     pos_gabarito$percentual_acerto$area,
#     mean), main = "Média de taxa de reconhecimento das origens exóticas por areas")
# barplot(tapply(
#     pos_gabarito$percentual_acerto$p_indice_nativas, 
#     pos_gabarito$percentual_acerto$area,
#     mean), main = "Média de taxa de reconhecimento das origens exóticas por areas")
grafico_densidade <- function(variavel, cor, titulo) {
    plot <- 
        pos_gabarito$proporcoes$por_turma %>% 
        ggdensity(x = variavel, fill = cor,
          main = titulo,
          xlab = "Percentual de acertos") + 
        xlim(0, 1) + 
        ylim(0, 8)
    nomalidade <- 
        ggtexttable(
            normalidade(pos_gabarito$proporcoes$por_turma[[variavel]]), 
            rows = NULL, theme = ttheme(base_style = "mOrange", base_size = 8)
        )
    
    resultado <- list(
        plot = plot,
        normalidade = nomalidade
    )
    return(resultado)
}
t1 <- grafico_densidade("p_nativas", "green", "Identificação do nome das espécies de origem Nativas")
t2 <- grafico_densidade("p_exoticas", "red", "Identificação do nome das espécies de origem Exóticas")
t3 <- grafico_densidade("p_origem_nativas", "darkgreen", "Identificação de origem Nativas")
t4 <- grafico_densidade("p_origem_exoticas", "darkred", "Identificação de origem Exóticas")
t5 <- grafico_densidade("p_indice_nativas", "orange", "Indice de reconhecimento Nativas (origens + espécies)")
t6 <- grafico_densidade("p_indice_exoticas", "orangered", "Indice de reconhecimento Exóticas (origens + espécies)")
barplot(tapply(
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    pos_gabarito$percentual_acerto$turmas,
    mean), main = "\nMédia de taxa de reconhecimento das origens nativas por turmas\n")

Teste de normalidade

Para determinar a normalidade nas distribuiçoes das respostas do jogo de imagens.

Identificação médio das turmas (nomes das espécies & origens)

grid.arrange(t1$plot, t2$plot,
             t1$normalidade, t2$normalidade,
             t3$plot, t4$plot,
             t3$normalidade, t4$normalidade,
             ncol = 2,
             heights = c(3,2,3,2),
             top = textGrob("Densidade de identificação média das turmas entre \nespecies e suas origens\n",
                            gp = gpar(fontsize = 20, font = 2))
             )

Indice de reconhecimento médio das turmas

grid.arrange(t5$plot, t6$plot,
             t5$normalidade, t6$normalidade,
             ncol = 2,
             heights = c(4,3),
             top = textGrob("Densidade dos indices de reconhecimento médio das turmas\n",
                            gp = gpar(fontsize = 20, font = 2))
             )

Q-Q Test

variancia <- data.frame(
    Algoritmo = c("F test to compare two variances"),
    "Comparação" = c("Nativas x Exóticas"),
    "Variável" = c(
        "Indice de reconhecimento",
        "Identificação do nome das espécies",
        "Identificação da origem"
    ),
    "p_valor" = c(
        var.test(pos_gabarito$proporcoes$por_turma$p_indice_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_indice_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_origem_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_origem_exoticas, 
                 alternative = "two.sided")$p.value
    )
)
variancia <- variancia %>%
    mutate(
        variancia = p_valor > 0.05,
        p_valor = cell_spec(round(p_valor, 4), bold = T, color = "black", align = "right"),
        variancia = cell_spec(variancia, bold = variancia,
                       color= ifelse(variancia, "white", "black"), 
                       background = ifelse(variancia, "green", "#CCCCCC"))
    )
variancia %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE) %>%
  collapse_rows(columns = 1:2, valign = "top") 
Algoritmo Comparação Variável p_valor variancia
F test to compare two variances Nativas x Exóticas Indice de reconhecimento 0.2969 TRUE
Identificação do nome das espécies 0.7332 TRUE
Identificação da origem 0.0343 FALSE

Teste de variância

Para determinar a variância

variancia <- data.frame(
    Algoritmo = c("F test to compare two variances"),
    "Comparação" = c("Nativas x Exóticas"),
    "Variável" = c(
        "Indice de reconhecimento",
        "Identificação do nome das espécies",
        "Identificação da origem"
    ),
    "p_valor" = c(
        var.test(pos_gabarito$proporcoes$por_turma$p_indice_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_indice_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_origem_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_origem_exoticas, 
                 alternative = "two.sided")$p.value
    )
)
variancia <- variancia %>%
    mutate(
        variancia = p_valor > 0.05,
        p_valor = cell_spec(round(p_valor, 4), bold = T, color = "black", align = "right"),
        variancia = cell_spec(variancia, bold = variancia,
                       color= ifelse(variancia, "white", "black"), 
                       background = ifelse(variancia, "green", "#CCCCCC"))
    )
variancia %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE) %>%
  collapse_rows(columns = 1:2, valign = "top") 
Algoritmo Comparação Variável p_valor variancia
F test to compare two variances Nativas x Exóticas Indice de reconhecimento 0.2969 TRUE
Identificação do nome das espécies 0.7332 TRUE
Identificação da origem 0.0343 FALSE

Analises descritivas

head(pos_gabarito$especies, 10)

Reconhecimento do nome das especies

Por origem
pos_gabarito$especies %>% 
    ggplot(aes(especieDesc, fr, fill = grupo)) + 
    geom_bar(stat="identity") +
    geom_text(aes(label = paste0(round(fr * 100, 1), "%")), 
              position = position_dodge(0.9), vjust = 0.5,
              hjust = -0.5) +
    scale_y_continuous(limits = c(0,1.2), labels = scales::percent) +
    facet_wrap(~origem, scales = "free_y") +
    coord_flip() +
    theme_bw() +
    labs(title = "Reconhecimento do nome das especies por origem",
         fill = "Grupos", x = "", y = "\nFrequencia relativa") +
    my_theme

Por espécie

Testes de hipoteses

Esperado p-valor >= 0.05 na normalidade (espera-se H0) Esperado p-valor <= 0.05 no teste de hipotese (espera-se H1)

Tabela dos testes de hipoteses aplicados

t1 <- t.test(
   pos_gabarito$percentual_acerto$p_nome_exoticas, 
   pos_gabarito$percentual_acerto$p_nome_nativas, 
   alternative = "two.sided", paired = TRUE, conf.level = .95)
t2 <- t.test(
   pos_gabarito$percentual_acerto$p_origem_exoticas, 
   pos_gabarito$percentual_acerto$p_origem_nativas, 
   alternative = "two.sided", paired = TRUE, conf.level = .95)
t3 <- t.test(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    alternative = "two.sided", paired = TRUE, conf.level = .95)
t1b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_nome_exoticas, 
    pos_gabarito$percentual_acerto$p_nome_nativas, 
    alternative = "two.sided", paired = TRUE)
t2b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_origem_exoticas, 
    pos_gabarito$percentual_acerto$p_origem_nativas, 
    alternative = "two.sided", paired = TRUE)
t3b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    alternative = "two.sided", paired = TRUE)
data.frame(
    "Comparação" = c("Exóticas x Nativas"),
    Algoritmo = c(t1$method, t2$method, t3$method, t1b$method, t2b$method, t3b$method),
    "Variável" = c(
        "Identificação do nome das espécies",
        "Identificação da origem",
        "Indice de reconhecimento"
    ),
    p_valor = c(t1$p.value, t2$p.value, t3$p.value, 
                t1b$p.value, t2b$p.value, t3b$p.value),
    H0 = c(t1$p.value >= 0.05, t2$p.value >= 0.05, t3$p.value >= 0.05, 
           t1b$p.value >= 0.05, t2b$p.value >= 0.05, t3b$p.value >= 0.05),
    H1 = c(t1$p.value < 0.05, t2$p.value < 0.05, t3$p.value < 0.05,
           t1b$p.value < 0.05, t2b$p.value < 0.05, t3b$p.value < 0.05),
    "Confiança" = c(
        paste(paste0(round(t1$conf.int * 100, 2), "%"), collapse = " ~ "),
        paste(paste0(round(t2$conf.int * 100, 2), "%"), collapse = " ~ "),
        paste(paste0(round(t3$conf.int * 100, 2), "%"), collapse = " ~ "),
        "-",
        "-",
        "-"
    )
) %>%
  mutate(
    p_valor = cell_spec(p_valor, bold = T, color = "black", align = "right"),
    H0 = cell_spec(H0, bold = H0,
                   color= ifelse(H0, "white", "black"), 
                   background = ifelse(H0, "green", "#CCCCCC")),
    H1 = cell_spec(H1, bold = H1, 
                   color = ifelse(H1, "white", "black"), 
                   background = ifelse(H1, "green", "#CCCCCC"))
  ) %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(2, bold = TRUE) %>%
  collapse_rows(columns = 1:2, valign = "top") %>%
  footnote(general = "Intervalo de confiança 95%",
           general_title = "\nObs.: ",
           footnote_as_chunk = T)
Comparação Algoritmo Variável p_valor H0 H1 Confiança
Exóticas x Nativas Paired t-test Identificação do nome das espécies 3.04980558564671e-88 FALSE TRUE 33.88% ~ 39.25%
Identificação da origem 9.53291446070658e-46 FALSE TRUE -31.12% ~ -24.46%
Indice de reconhecimento 2.42750761381397e-13 FALSE TRUE 8.53% ~ 14.47%
Wilcoxon signed rank test with continuity correction Identificação do nome das espécies 9.13901290530953e-52 FALSE TRUE -
Identificação da origem 1.34804992730944e-34 FALSE TRUE -
Indice de reconhecimento 4.73943028972212e-12 FALSE TRUE -

Obs.:
Intervalo de confiança 95%

1 - Os alunos itendificam mais os nomes dos animais de espécies exóticas que os animais de espécies nativas.

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_nome_exoticas and pos_gabarito$percentual_acerto$p_nome_nativas
t = 27, df = 370, p-value <2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3388 0.3925
sample estimates:
mean of the differences 
                 0.3657 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_nome_exoticas and pos_gabarito$percentual_acerto$p_nome_nativas
V = 52000, p-value <2e-16
alternative hypothesis: true location shift is not equal to 0

2 - Os alunos identificam mais espécies de origem exótica que as de origem nativa.

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_origem_exoticas and pos_gabarito$percentual_acerto$p_origem_nativas
t = -16, df = 370, p-value <2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.3112 -0.2446
sample estimates:
mean of the differences 
                -0.2779 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_origem_exoticas and pos_gabarito$percentual_acerto$p_origem_nativas
V = 4100, p-value <2e-16
alternative hypothesis: true location shift is not equal to 0

3 - Os alunos identificam mais as espécies exóticas (nome dos animais e origem) que espécies nativas.

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_indice_exoticas and pos_gabarito$percentual_acerto$p_indice_nativas
t = 7.6, df = 370, p-value = 2e-13
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.08525 0.14472
sample estimates:
mean of the differences 
                  0.115 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_indice_exoticas and pos_gabarito$percentual_acerto$p_indice_nativas
V = 25000, p-value = 5e-12
alternative hypothesis: true location shift is not equal to 0

4 - Os alunos reconhecem mais mamíferos do que os demais grupos taxonómicos.

grid.arrange(
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_aves,
                  pos_gabarito$percentual_acerto$p_nativa_aves,
                  "Aves", "Média percentual de acertos\n",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)),
    
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_invertebrado,
                  pos_gabarito$percentual_acerto$p_nativa_invertebrado,
                  "Invertebrados", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)),
    
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_mamifero,
                  pos_gabarito$percentual_acerto$p_nativa_mamifero,
                  "Mamiferos", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_peixe,
                  pos_gabarito$percentual_acerto$p_nativa_peixe,
                  "Peixes", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_reptil,
                  pos_gabarito$percentual_acerto$p_nativa_reptil,
                  "Répteis", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    ncol = 5,
    top = textGrob("Niveis de reconhecimento por origem\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    right = "\n"
)

anova(lm(value ~ grupo * origem, tmp))
Analysis of Variance Table

Response: value
               Df Sum Sq Mean Sq F value  Pr(>F)    
grupo           4     14     3.6    17.3 4.4e-14 ***
origem          1    123   122.7   597.4 < 2e-16 ***
grupo:origem    4     18     4.5    21.7 < 2e-16 ***
Residuals    3660    752     0.2                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
tukey
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = lm(value ~ grupo * origem, tmp))

$grupo
                            diff      lwr      upr  p adj
invertebrado-aves     -1.458e-01 -0.21034 -0.08122 0.0000
mamifero-aves         -7.883e-15 -0.06456  0.06456 1.0000
peixe-aves            -4.905e-02 -0.11361  0.01551 0.2319
reptil-aves           -1.294e-01 -0.19399 -0.06487 0.0000
mamifero-invertebrado  1.458e-01  0.08122  0.21034 0.0000
peixe-invertebrado     9.673e-02  0.03217  0.16129 0.0004
reptil-invertebrado    1.635e-02 -0.04821  0.08091 0.9585
peixe-mamifero        -4.905e-02 -0.11361  0.01551 0.2319
reptil-mamifero       -1.294e-01 -0.19399 -0.06487 0.0000
reptil-peixe          -8.038e-02 -0.14494 -0.01582 0.0062

$origem
                  diff    lwr     upr p adj
nativa-exotica -0.3657 -0.395 -0.3363     0

$`grupo:origem`
                                              diff       lwr       upr  p adj
invertebrado:exotica-aves:exotica        -0.032698 -0.138602  0.073206 0.9935
mamifero:exotica-aves:exotica             0.103542 -0.002362  0.209446 0.0616
peixe:exotica-aves:exotica                0.114441  0.008537  0.220345 0.0222
reptil:exotica-aves:exotica              -0.147139 -0.253043 -0.041235 0.0005
aves:nativa-aves:exotica                 -0.220708 -0.326612 -0.114804 0.0000
invertebrado:nativa-aves:exotica         -0.479564 -0.585468 -0.373660 0.0000
mamifero:nativa-aves:exotica             -0.324251 -0.430155 -0.218347 0.0000
peixe:nativa-aves:exotica                -0.433243 -0.539147 -0.327339 0.0000
reptil:nativa-aves:exotica               -0.332425 -0.438329 -0.226521 0.0000
mamifero:exotica-invertebrado:exotica     0.136240  0.030336  0.242144 0.0019
peixe:exotica-invertebrado:exotica        0.147139  0.041235  0.253043 0.0005
reptil:exotica-invertebrado:exotica      -0.114441 -0.220345 -0.008537 0.0222
aves:nativa-invertebrado:exotica         -0.188011 -0.293915 -0.082107 0.0000
invertebrado:nativa-invertebrado:exotica -0.446866 -0.552770 -0.340962 0.0000
mamifero:nativa-invertebrado:exotica     -0.291553 -0.397457 -0.185649 0.0000
peixe:nativa-invertebrado:exotica        -0.400545 -0.506449 -0.294641 0.0000
reptil:nativa-invertebrado:exotica       -0.299728 -0.405632 -0.193824 0.0000
peixe:exotica-mamifero:exotica            0.010899 -0.095005  0.116803 1.0000
reptil:exotica-mamifero:exotica          -0.250681 -0.356585 -0.144777 0.0000
aves:nativa-mamifero:exotica             -0.324251 -0.430155 -0.218347 0.0000
invertebrado:nativa-mamifero:exotica     -0.583106 -0.689010 -0.477202 0.0000
mamifero:nativa-mamifero:exotica         -0.427793 -0.533697 -0.321889 0.0000
peixe:nativa-mamifero:exotica            -0.536785 -0.642689 -0.430881 0.0000
reptil:nativa-mamifero:exotica           -0.435967 -0.541871 -0.330063 0.0000
reptil:exotica-peixe:exotica             -0.261580 -0.367484 -0.155676 0.0000
aves:nativa-peixe:exotica                -0.335150 -0.441054 -0.229246 0.0000
invertebrado:nativa-peixe:exotica        -0.594005 -0.699909 -0.488101 0.0000
mamifero:nativa-peixe:exotica            -0.438692 -0.544596 -0.332788 0.0000
peixe:nativa-peixe:exotica               -0.547684 -0.653588 -0.441780 0.0000
reptil:nativa-peixe:exotica              -0.446866 -0.552770 -0.340962 0.0000
aves:nativa-reptil:exotica               -0.073569 -0.179473  0.032335 0.4575
invertebrado:nativa-reptil:exotica       -0.332425 -0.438329 -0.226521 0.0000
mamifero:nativa-reptil:exotica           -0.177112 -0.283016 -0.071208 0.0000
peixe:nativa-reptil:exotica              -0.286104 -0.392008 -0.180200 0.0000
reptil:nativa-reptil:exotica             -0.185286 -0.291190 -0.079382 0.0000
invertebrado:nativa-aves:nativa          -0.258856 -0.364760 -0.152952 0.0000
mamifero:nativa-aves:nativa              -0.103542 -0.209446  0.002362 0.0616
peixe:nativa-aves:nativa                 -0.212534 -0.318438 -0.106630 0.0000
reptil:nativa-aves:nativa                -0.111717 -0.217621 -0.005813 0.0291
mamifero:nativa-invertebrado:nativa       0.155313  0.049409  0.261217 0.0002
peixe:nativa-invertebrado:nativa          0.046322 -0.059582  0.152226 0.9321
reptil:nativa-invertebrado:nativa         0.147139  0.041235  0.253043 0.0005
peixe:nativa-mamifero:nativa             -0.108992 -0.214896 -0.003088 0.0377
reptil:nativa-mamifero:nativa            -0.008174 -0.114078  0.097730 1.0000
reptil:nativa-peixe:nativa                0.100817 -0.005087  0.206721 0.0777

5 - Estudantes que residem na Cidade 1 (com UC) identificam mais espécies nativas do que estudantes que residem na Cidade 2 (sem UC).

t.test(p_indice_nativas ~ municipio, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by municipio
t = 0.65, df = 360, p-value = 0.5
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.02863  0.05711
sample estimates:
mean in group Bela Vista de Goiás            mean in group Silvânia 
                           0.3362                            0.3220 

6 - Estudantes que residem em área rural tem maior conhecimento sobre as espécies nativas.

tmp <- pos_gabarito$percentual_acerto %>%
    select(area, p_nome_exoticas:p_indice_nativas)
t.test(p_indice_nativas ~ area, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by area
t = -2, df = 110, p-value = 0.05
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.1040103  0.0002798
sample estimates:
 mean in group Rural mean in group Urbana 
              0.2873               0.3392 
tmp <- pos_gabarito$percentual_acerto %>%
    select(area, p_nome_exoticas:p_indice_nativas) %>%
    melt("area")
tmp <-
    cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
    select(area, indicador, origem, value)
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = area, y = value, fill = origem), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

7 - Frequencia de contato natureza

tmp <- pos_gabarito$percentual_acerto %>%
    select(frequencia, p_nome_exoticas:p_indice_nativas) %>%
    melt(id = "frequencia")
tmp <-
    cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
    select(frequencia, indicador, origem, value)
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = origem, y = value, fill = frequencia), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

anova(lm(value  ~ frequencia, data = tmp %>% filter(indicador == "indice")))
Analysis of Variance Table

Response: value
            Df Sum Sq Mean Sq F value Pr(>F)
frequencia   4    0.1  0.0247    0.46   0.76
Residuals  729   38.9  0.0533               
#TukeyHSD(aov(lm(value  ~ frequencia, data = tmp %>% filter(indicador == "indice"))))

8 - Fez aulas praticas

anova(lm(value  ~ fez.aula, data = tmp %>% filter(indicador == "indice")))
Analysis of Variance Table

Response: value
           Df Sum Sq Mean Sq F value Pr(>F)
fez.aula    6    0.2  0.0388    0.73   0.63
Residuals 727   38.7  0.0533               

9 - Estudantes de Silvania que visitam a UC tem maior proporção de acertos espécies nativas.

#normalidade(tmp$p_indice_nativas)
t.test(p_indice_nativas ~ flona, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by flona
t = -1.6, df = 86, p-value = 0.1
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.13024  0.01485
sample estimates:
mean in group Não mean in group Sim 
           0.2808            0.3385 

10 - Ranking dos animais

11 - Ranking dos animais citados para proteção

LS0tCnRpdGxlOiAiTWVzdHJhZG8gQmlvbG9naWEiCmF1dGhvcjogIkhlcnNvbiBNZWxvIgpkYXRlOiAiMjgvMDYvMjAxOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQotLS0KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkobm9ydGVzdCkKbGlicmFyeShzdGF0cykKbGlicmFyeShtdWx0Y29tcFZpZXcpCgpzdXBwcmVzc1dhcm5pbmdzKFN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsICdlbl9VUy5VVEYtOCcpKQojb3B0aW9ucyhzY2lwZW4gPSA5OTksIGRpZ2l0cyA9IDQpCm9wdGlvbnMoc2NpcGVuID0gMCwgZGlnaXRzID0gNCkKIyBvcHRpb25zKCJzY2lwZW4iPS0xMDAsICJkaWdpdHMiPTYpCiMgZ2V0d2QoKQpsb2FkKCJkYWRvcy5SRGF0YSIpCgoKbXlfdGhlbWUgPC0gCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCBoanVzdCA9IDEsIHNpemUgPSAxMiksIAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKbm9ybWFsaWRhZGUgPC0gZnVuY3Rpb24oeCkgewogICAgdDEgPC0gc2hhcGlyby50ZXN0KHgpCiAgICB0MiA8LSBzZi50ZXN0KHgpCiAgICB0MyA8LSBsaWxsaWUudGVzdCh4KQogICAgdDQgPC0gYWQudGVzdCh4KQogICAgdDUgPC0gY3ZtLnRlc3QoeCkKICAgIHJldHVybiggZGF0YS5mcmFtZSgKICAgICAgICBBbGdvcml0bW8gPSBjKHQxJG1ldGhvZCwgdDIkbWV0aG9kLCAKICAgICAgICAgICAgICAgICAgIHQzJG1ldGhvZCwgdDQkbWV0aG9kLCAKICAgICAgICAgICAgICAgICAgIHQ1JG1ldGhvZCksCiAgICAgICAgcC52YWxvciA9IGModDEkcC52YWx1ZSwgdDIkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgdDMkcC52YWx1ZSwgdDQkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgdDUkcC52YWx1ZSksCiAgICAgICAgTm9ybWFsaWRhZGUgPSBjKHQxJHAudmFsdWUgPiAuMDUsIHQyJHAudmFsdWUgPiAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgdDMkcC52YWx1ZSA+IC4wNSwgdDQkcC52YWx1ZSA+IC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICB0NSRwLnZhbHVlID4gLjA1KQogICAgKSkKfQojIEltcGxlbWVudGFuZG8gZm9ybXVsYSBwYXJhIHRlc3RlcyBlc3RhdMOtc3RpY29zIHBhZHJvbml6YWRhCnRlc3RlLmFub3ZhIDwtIGZ1bmN0aW9uKGZvcm11bGEsIGRhdGEpIHsKICAgIHQubm9ybWFsaWRhZGUgPC0gCiAgICAgICAgYWdncmVnYXRlKGZvcm11bGEsIGRhdGEsIAogICAgICAgICAgICAgICAgICBGVU4gPSBmdW5jdGlvbih4KSBzaGFwaXJvLnRlc3QoeCkkcC52YWx1ZSkgJT4lCiAgICAgICAgbXV0YXRlKEgwID0gKHZhbHVlIDw9IDAuMDUpLAogICAgICAgICAgICAgICBub3JtYWxpZGFkZSA9IGNlbGxfc3BlYyhIMCwgYm9sZCA9IEgwLAogICAgICAgICAgICAgICAgICAgY29sb3I9IGlmZWxzZShIMCwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGlmZWxzZShIMCwgImdyZWVuIiwgIiNDQ0NDQ0MiKSkKICAgICAgICAgICAgICAgKSAlPiUKICAgICAgICBrYWJsZShlc2NhcGUgPSBGKSAlPiUKICAgICAgICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogICAgICAgIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQoKICAgIHQuYW5vdmEgPC0gYW5vdmEobG0oZm9ybXVsYSwgZGF0YSkpCiAgICB0LnR1a2V5IDwtIFR1a2V5SFNEKGFvdihsbShmb3JtdWxhLCBkYXRhKSkpCgogICAgaWYobGVuZ3RoKHQudHVrZXkpID4gMSkgewogICAgICAgIGVycm9yKCJBTk9WQSBmYXRvcmlhbCAoZmFsdGEgdHJhdGFyIGlzc28pISIpCiAgICB9CiAgICB0dWtleS50YmwgPC0gYXMuZGF0YS5mcmFtZSh0LnR1a2V5W1sxXV0sIGN1dC5uYW1lcyA9IEYpCiAgICB0dWtleS50YmwkY29tcGFyYWNhbyA9IHJvd25hbWVzKHR1a2V5LnRibCkKICAgIHJvd25hbWVzKHR1a2V5LnRibCkgPSBOVUxMCiAgICB0YWJlbGEudHVrZXkgPC0gdHVrZXkudGJsICU+JQogICAgICAgIG11dGF0ZShIMCA9IChgcCBhZGpgIDw9IDAuMDUpLAogICAgICAgICAgICAgICBzaWduaWZpY2FuY2lhID0gY2VsbF9zcGVjKEgwLCBib2xkID0gSDAsCiAgICAgICAgICAgICAgICAgICBjb2xvcj0gaWZlbHNlKEgwLCAid2hpdGUiLCAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gaWZlbHNlKEgwLCAiZ3JlZW4iLCAiI0NDQ0NDQyIpKQogICAgICAgICAgICAgICApICU+JQogICAgICAgIHNlbGVjdChjb21wYXJhY2FvLCBkaWZmOmBwIGFkamAsIHNpZ25pZmljYW5jaWEpICU+JQogICAgICAgIGthYmxlKGVzY2FwZSA9IEYpICU+JQogICAgICAgIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgICAgICAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpCiAgICAKICAgICAgICAKICAgIHJlc3VsdGFkbyA8LSAKICAgICAgICBsaXN0KAogICAgICAgICAgICB0ZXN0ZS5ub3JtYWxpZGFkZSA9IHQubm9ybWFsaWRhZGUsCiAgICAgICAgICAgIHRlc3RlLmFub3ZhID0gdC5hbm92YSwKICAgICAgICAgICAgdHVrZXkgPSB0LnR1a2V5LAogICAgICAgICAgICB0YWJlbGEudHVrZXkgPSB0YWJlbGEudHVrZXkKICAgICAgICApCiAgICByZXR1cm4ocmVzdWx0YWRvKQp9CgppYy5tZWRpYSA8LSBmdW5jdGlvbih2ZXRvckRhZG9zKXsKICAgICMjIwogICAgIyMgQ2FsY3VsYW5kbyBvIGludGVydmFsbyBkZSBjb25maWFuw6dhCiAgICAjIyMKICAgIG1lZGlhIDwtIG1lYW4odmV0b3JEYWRvcykgI23DqWRpYSBkYSBhbW9zdHJhCiAgICBzIDwtIHNkKHZldG9yRGFkb3MpICNkZXN2aW8gcGFkcsOjbwogICAgbiA8LSBsZW5ndGgodmV0b3JEYWRvcykgI3RhbWFuaG8gZGEgYW1vc3RyYQogICAgZXJyb1BhZHJhbyA8LSBxbm9ybSgwLjk3NSkqcy9zcXJ0KG4pCiAgICBsaW1pdGUgPC0gMS45NiAqIGVycm9QYWRyYW8KICAgIGVycm9yLmluZmVyaW9yIDwtIG1lZGlhIC0gZXJyb1BhZHJhbwogICAgZXJyb3Iuc3VwZXJpb3IgPC0gbWVkaWEgKyBlcnJvUGFkcmFvCiAgICBsaW1pdGUuaW5mZXJpb3IgPC0gbWVkaWEgLSBsaW1pdGUKICAgIGxpbWl0ZS5zdXBlcmlvciA8LSBtZWRpYSArIGxpbWl0ZQogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgICAgbWVkaWEsIAogICAgICAgIGRlc3ZpbyA9IHMsIAogICAgICAgIGVycm9QYWRyYW8sIAogICAgICAgIGVycm9yLmluZmVyaW9yLCBlcnJvci5zdXBlcmlvciwgCiAgICAgICAgbGltaXRlLmluZmVyaW9yLCBsaW1pdGUuc3VwZXJpb3IpKQp9CgpwbG90QW5hbGlzZU1lZGlhcyA8LSBmdW5jdGlvbih2ZXRvckV4b3RpY2FzLCB2ZXRvck5hdGl2YXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXR1bG8gPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0ZXh0ID0gIk3DqWRpYSBwZXJjZW50dWFsIGRlIGFjZXJ0b3NcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXhvdGljYXMgPSAtMSwgbWVkaWFOYXRpdmFzID0gLTEpIHsKICAgIHRtcCA8LSByYmluZCgKICAgICAgICBjYmluZChvcmlnZW0gPSAiRXhvdGljYXMiLCBpYy5tZWRpYSh2ZXRvckV4b3RpY2FzKSksCiAgICAgICAgY2JpbmQob3JpZ2VtID0gIk5hdGl2YXMiLCBpYy5tZWRpYSh2ZXRvck5hdGl2YXMpKSMsCiAgICAgICAgI2NiaW5kKG9yaWdlbSA9ICJEaWZlcmVuw6dhIiwgaWMubWVkaWEodmV0b3JFeG90aWNhcyAtIHZldG9yTmF0aXZhcykpCiAgICApCiAgICAjIGxpbWl0ZXNFc2NhbGEgPSBjKG1pbih0bXAkbGltaXRlLmluZmVyaW9yKSowLjgsICMgMjAlIGEgbWVub3MgZG8gbWVub3IgbGltaXRlIGluZmVyaW9yIAogICAgIyAgICAgICAgICAgICAgICAgICBtYXgodG1wJGxpbWl0ZS5zdXBlcmlvcikqMS4yKSAjIDIwJSBhIG1haXMgZG8gbWVub3IgbGltaXRlIHN1cGVyaW9yIAogICAgbGltaXRlc0VzY2FsYSA8LSBjKDAsMSkKICAgIAogICAgcCA8LSAKICAgICAgICBnZ3Bsb3QodG1wLCBhZXMob3JpZ2VtLCBtZWRpYSkpICsKICAgICAgICBnZW9tX2Nyb3NzYmFyKGFlcyh5bWluID0gZXJyb3IuaW5mZXJpb3IsIHltYXggPSBlcnJvci5zdXBlcmlvciksIHdpZHRoID0gMC4xKSArCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxpbWl0ZS5pbmZlcmlvciwgeW1heCA9IGxpbWl0ZS5zdXBlcmlvciksIHdpZHRoID0gMC4xKSArCiAgICAgICAgZ2VvbV9wb2ludChhZXMob3JpZ2VtLCBtZWRpYSkpICsKICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gbGltaXRlc0VzY2FsYSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgICAgICAgbGFicyh0aXRsZSA9IHRpdHVsbywKICAgICAgICAgICAgIHggPSAiIiwKICAgICAgICAgICAgIHkgPSB5dGV4dCwKICAgICAgICAgICAgIGNvbG9yID0gJ03DqWRpYXMgb3JpZ2VucyBnZXJhbCcpICsgCiAgICAgICAgbXlfdGhlbWUgKyAKICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQogICAgaWYobWVkaWFFeG90aWNhcyA+IDApIHsKICAgICAgICBwIDwtIAogICAgICAgICAgICBwICsKICAgICAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVkaWFFeG90aWNhcywgbGluZXR5cGUgPSAyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG91cj0iZGFya2JsdWUiKSArCiAgICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lZGlhTmF0aXZhcywgbGluZXR5cGUgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXI9InJlZCIpCiAgICB9CiAgICByZXR1cm4ocCkKfQoKcGxvdEFuYWxpc2VUYXhvbm9taWNvc0dlbm92YXJ0IDwtIGZ1bmN0aW9uKCkgewogIAogIG1lZGlhRXhvdGljYXMgPC0gbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9ub21lX2V4b3RpY2FzKQogIG1lZGlhTmF0aXZhcyA8LSBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25vbWVfbmF0aXZhcykKICAKICB0bXAgPC0gcmJpbmQoCiAgICBjYmluZChncnVwbyA9ICJBdmVzIiwgb3JpZ2VtID0gImV4b3RpY2EiLCBpYy5tZWRpYShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX2F2ZXMpKSwKICAgIGNiaW5kKGdydXBvID0gIkludmVydGVicmFkb3MiLCBvcmlnZW0gPSAiZXhvdGljYSIsIGljLm1lZGlhKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfaW52ZXJ0ZWJyYWRvKSksCiAgICBjYmluZChncnVwbyA9ICJNYW3DrWZlcm9zIiwgb3JpZ2VtID0gImV4b3RpY2EiLCBpYy5tZWRpYShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX21hbWlmZXJvKSksCiAgICBjYmluZChncnVwbyA9ICJQZWl4ZXMiLCBvcmlnZW0gPSAiZXhvdGljYSIsIGljLm1lZGlhKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfcGVpeGUpKSwKICAgIGNiaW5kKGdydXBvID0gIlLDqXB0ZWlzIiwgb3JpZ2VtID0gImV4b3RpY2EiLCBpYy5tZWRpYShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX3JlcHRpbCkpLAogICAgCiAgICBjYmluZChncnVwbyA9ICJBdmVzIiwgb3JpZ2VtID0gIm5hdGl2YSIsIGljLm1lZGlhKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9hdmVzKSksCiAgICBjYmluZChncnVwbyA9ICJJbnZlcnRlYnJhZG9zIiwgb3JpZ2VtID0gIm5hdGl2YSIsIGljLm1lZGlhKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9pbnZlcnRlYnJhZG8pKSwKICAgIGNiaW5kKGdydXBvID0gIk1hbcOtZmVyb3MiLCBvcmlnZW0gPSAibmF0aXZhIiwgaWMubWVkaWEocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX21hbWlmZXJvKSksCiAgICBjYmluZChncnVwbyA9ICJQZWl4ZXMiLCBvcmlnZW0gPSAibmF0aXZhIiwgaWMubWVkaWEocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX3BlaXhlKSksCiAgICBjYmluZChncnVwbyA9ICJSw6lwdGVpcyIsIG9yaWdlbSA9ICJuYXRpdmEiLCBpYy5tZWRpYShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfcmVwdGlsKSkKICApCiAgbGltaXRlc0VzY2FsYSA8LSBjKDAsMSkKICAKICBwIDwtIAogICAgZ2dwbG90KHRtcCwgYWVzKGdydXBvLCBtZWRpYSwgY29sb3VyID0gb3JpZ2VtKSkgKwogICAgZ2VvbV9jcm9zc2JhcihhZXMoeW1pbiA9IGVycm9yLmluZmVyaW9yLCB5bWF4ID0gZXJyb3Iuc3VwZXJpb3IpLCB3aWR0aCA9IDAuMSkgKwogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxpbWl0ZS5pbmZlcmlvciwgeW1heCA9IGxpbWl0ZS5zdXBlcmlvciksIHdpZHRoID0gMC4xKSArCiAgICBnZW9tX3BvaW50KGFlcyhncnVwbywgbWVkaWEpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gbGltaXRlc0VzY2FsYSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgICBsYWJzKHRpdGxlID0gIlJlY29uaGVjaW1lbnRvIGRhcyBlc3DDqWNpZXMiLAogICAgICAgICB4ID0gIiIsCiAgICAgICAgIHkgPSAiXG5UYXhhIGRlIHJlc3Bvc3RhcyBjb3JyZXRhc1xuIiwKICAgICAgICAgY29sb3VyID0gJ09yaWdlbTonKSArIAogICAgbXlfdGhlbWUgIysgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKICBpZihtZWRpYUV4b3RpY2FzID4gMCkgewogICAgcCA8LSAKICAgICAgcCArCiAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lZGlhRXhvdGljYXMsIGxpbmV0eXBlID0gMiwKICAgICAgICAgICAgICAgICBjb2xvdXI9Im9yYW5nZXJlZCIpCiAgfQogIGlmKG1lZGlhTmF0aXZhcyA+IDApIHsKICAgIHAgPC0gCiAgICAgIHAgKwogICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWRpYU5hdGl2YXMsIGxpbmV0eXBlID0gMiwgCiAgICAgICAgICAgICAgICAgY29sb3VyPSJkYXJrYmx1ZSIpCiAgfQogIHJldHVybihwKQp9CgpgYGAKCiMjIEFuw6FsaXNlIGRvIEpvZ28gZGUgSW1hZ2VucyBhcGxpY2FkYXMgbm8gRW5zaW5vIG3DqWRpbwoKCiMjIyBBbW9zdHJhIGRvcyBkYWRvcyBkYSBwZXNxdWlzYSByZWFsaXphZGEKClRhYnVsYcOnw6NvIGRvIG7Dum1lcm8gZGUgYWNlcnRvcyBkb3MgaXRlbnMgZG8gam9nbyBkZSBpbWFnZW5zLgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTJ9CmRlc2NfY29sdW5hcyA8LSBkYXRhLmZyYW1lKAogICAgIkNvbHVuYSIgPSBjKCJFeG90aWNhcyIsICJOYXRpdmFzIiksCiAgICAiRGVzY3Jpw6fDo28iID0gYygiTsO6bWVybyBkZSBhY2VydG9zIGRlbnRyZSB0b2RhcyBhcyBpbWFnZW5zIGV4aWJpZGFzIGRvIHRpcG8gZXjDs3RpY2EsIHZhbG9yIGV4cGVyYWRvIMOpIDUuIiwKICAgICAgICAgICAgICAgICAgICAiTsO6bWVybyBkZSBhY2VydG9zIGRlbnRyZSB0b2RhcyBhcyBpbWFnZW5zIGV4aWJpZGFzIGRvIHRpcG8gbmF0aXZhLCB2YWxvciBleHBlcmFkbyDDqSA1LiIpCiAgICApCmRlc2NfY29sdW5hcyAlPiUKICBrYWJsZSgpICU+JQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpCgpgYGAKCgpgYGB7cn0KaGVhZChwb3NfZ2FiYXJpdG8kZGFkb3MsIDEwKQpgYGAKCiMjIyMgRGV0ZXJtaW5hZG8gYSB0YXhhIGRlIHBlcmNlcMOnw6NvCgpFbnRlbmRlLXNlIHBvciB0YXhhIGRlIHBlcmNlcMOnw6NvIG8gZmF0b3IgZGV0ZXJtaW5hZG8gcGVsYSBxdWFudGlkYWRlIG3DqWRpYSBkZSBhY2VydG9zIGRlbnRyZSBhcyBxdWVzdMO1ZXMgYXByZXNlbnRhZGFzIGFvcyBhbHVub3MsIGVtIHJlbGHDp8OjbyBhIHR1cm1hIGVtIHF1ZSBvIHF1ZXN0aW9uYXJpbyBmb2kgYXBsaWNhZG8uCgpQZXJjZXDDp8OjbyBkb3MgYWx1bm9zCgpgYGB7cn0KcHJpbnQocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvKQpgYGAKCiMjIyMgRW50ZW5kZW5kbyBhIGRpc3RyaWJ1acOnw6NvIGRhcyBtw6lkaWFzCgpOw612ZWlzIGRlIHJlY29uaGVjaW1lbnRvIChhY2VydG9zKSBwb3IgdGlwbyBkZSBvcmlnZW0gZG9zIGFuaW1haXMKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zfQpncmlkLmFycmFuZ2UoCiAgICBwbG90QW5hbGlzZU1lZGlhcyhwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9ub21lX2V4b3RpY2FzLAogICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9ub21lX25hdGl2YXMsCiAgICAgICAgICAgICAgICAgICJJZGVudGlmaWNhw6fDo28gZG9zIG5vbWVzIiksCiAgICBwbG90QW5hbGlzZU1lZGlhcyhwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9vcmlnZW1fZXhvdGljYXMsCiAgICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX29yaWdlbV9uYXRpdmFzLAogICAgICAgICAgICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRhcyBvcmlnZW5zIiwgeSA9ICIiKSwKICAgIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcywKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMsCiAgICAgICAgICAgICAgICAgICJUYXhhIGRlIHJlY29uaGVjaW1lbnRvIiwgeSA9ICIiKSwgCiAgICBuY29sID0gMywKICAgIHRvcCA9IHRleHRHcm9iKCJOaXZlaXMgZGUgcmVjb25oZWNpbWVudG8gcG9yIG9yaWdlbVxuIiwgCiAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAyMCwgZm9udCA9IDIpKSwKICAgIHJpZ2h0ID0gIlxuIgopCmBgYAoKRGlmZXJlbsOnYSBkZSBhY2VydG9zCgpgYGB7ciwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NH0KZ3JpZC5hcnJhbmdlKAogICAgZ2dwbG90KHBvc19nYWJhcml0byRkYWRvcywgYWVzKGV4b3RpY2FzIC0gbmF0aXZhcykpICsKICAgICAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTApICsKICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEzMCkpICsKICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSw1KSkgKwogICAgICAgIGxhYnModGl0bGUgPSAiSWRlbnRpZmljYcOnw6NvIGRvcyBub21lcyIsIHkgPSAiVG90YWwgZGUgYWNlcnRvcyIpICsKICAgICAgICBteV90aGVtZSwKICAgIGdncGxvdChwb3NfZ2FiYXJpdG8kZGFkb3MsIGFlcyhvcmlnZW1fZXhvdGljYXMgLSBvcmlnZW1fbmF0aXZhcykpICsKICAgICAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTApICsKICAgICAgICAjZ2VvbV9kZW5zaXR5KGZpbGwgPSAicmVkIikgKwogICAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTMwKSkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC01LDUpKSArCiAgICAgICAgbGFicyh0aXRsZSA9ICJJZGVudGlmaWNhw6fDo28gZGFzIG9yaWdlbnMiLCB5ID0gIiIpICsKICAgICAgICBteV90aGVtZSwKICAgIGdncGxvdChwb3NfZ2FiYXJpdG8kZGFkb3MsIGFlcyhpbmRpY2VfZXhvdGljYXMgLSBpbmRpY2VfbmF0aXZhcykpICsKICAgICAgICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAsIGZpbGwgPSAiZGFya2JsdWUiKSArCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMzApKSArCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTUsNSkpICsKICAgICAgICBsYWJzKHRpdGxlID0gIlRheGEgZGUgcmVjb25oZWNpbWVudG8iLCB5ID0gIiIpICsKICAgICAgICBteV90aGVtZSwgCiAgICBnZ3RleHR0YWJsZShub3JtYWxpZGFkZShwb3NfZ2FiYXJpdG8kZGFkb3MkZXhvdGljYXMgLSBwb3NfZ2FiYXJpdG8kZGFkb3MkbmF0aXZhcyksCiAgICAgICAgICAgICAgICByb3dzID0gTlVMTCwgdGhlbWUgPSB0dGhlbWUoYmFzZV9zdHlsZSA9ICJtT3JhbmdlIiwgYmFzZV9zaXplID0gOSkpLAogICAgZ2d0ZXh0dGFibGUobm9ybWFsaWRhZGUocG9zX2dhYmFyaXRvJGRhZG9zJG9yaWdlbV9leG90aWNhcyAtIHBvc19nYWJhcml0byRkYWRvcyRvcmlnZW1fbmF0aXZhcyksCiAgICAgICAgICAgICAgICByb3dzID0gTlVMTCwgdGhlbWUgPSB0dGhlbWUoYmFzZV9zdHlsZSA9ICJtT3JhbmdlIiwgYmFzZV9zaXplID0gOSkpLAogICAgZ2d0ZXh0dGFibGUobm9ybWFsaWRhZGUocG9zX2dhYmFyaXRvJGRhZG9zJGluZGljZV9leG90aWNhcyAtIHBvc19nYWJhcml0byRkYWRvcyRpbmRpY2VfbmF0aXZhcyksCiAgICAgICAgICAgICAgICByb3dzID0gTlVMTCwgdGhlbWUgPSB0dGhlbWUoYmFzZV9zdHlsZSA9ICJtT3JhbmdlIiwgYmFzZV9zaXplID0gOSkpLAogICAgbmNvbCA9IDMsCiAgICB0b3AgPSB0ZXh0R3JvYigiSGlzdG9ncmFtYSBkYXMgZGlmZXJlbsOnYXMgRXhvdGljYXMgeCBOYXRpdmFzXG4iLCAKICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpLAogICAgaGVpZ2h0cz1jKDMvNCwgMS80KSwKICAgIHJpZ2h0ID0gIlxuIiwKICAgIGJvdHRvbSA9ICJcbiIKKQpgYGAKCkdydXBvcyB0YXhvbsOzbWljb3MKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zLjV9CnJiaW5kKAogICAgY2JpbmQoZ3J1cG8gPSAiQXZlcyIsIG9yaWdlbSA9ICJleG90aWNhIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9hdmVzKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiQXZlcyIsIG9yaWdlbSA9ICJuYXRpdmEiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfYXZlcykpKSwKICAgIGNiaW5kKGdydXBvID0gIkludmVydGVicmFkb3MiLCBvcmlnZW0gPSAiZXhvdGljYSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfaW52ZXJ0ZWJyYWRvKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiSW52ZXJ0ZWJyYWRvcyIsIG9yaWdlbSA9ICJuYXRpdmEiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfaW52ZXJ0ZWJyYWRvKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiTWFtaWZlcm9zIiwgb3JpZ2VtID0gImV4b3RpY2EiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX21hbWlmZXJvKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiTWFtaWZlcm9zIiwgb3JpZ2VtID0gIm5hdGl2YSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9tYW1pZmVybykpKSwKICAgIGNiaW5kKGdydXBvID0gIlBlaXhlcyIsIG9yaWdlbSA9ICJleG90aWNhIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9wZWl4ZSkpKSwKICAgIGNiaW5kKGdydXBvID0gIlBlaXhlcyIsIG9yaWdlbSA9ICJuYXRpdmEiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfcGVpeGUpKSksCiAgICBjYmluZChncnVwbyA9ICJSw6lwdGVpcyIsIG9yaWdlbSA9ICJleG90aWNhIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9yZXB0aWwpKSksCiAgICBjYmluZChncnVwbyA9ICJSw6lwdGVpcyIsIG9yaWdlbSA9ICJuYXRpdmEiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfcmVwdGlsKSkpCikgJT4lCiAgICAgICAgZ2dwbG90KGFlcyh4PVZhcjEsIHkgPSBGcmVxLCBmaWxsID0gb3JpZ2VtKSkgKyAKICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS41LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAgICAgICBmYWNldF93cmFwKH5ncnVwbywgc2NhbGVzID0gImZyZWUiKSArIAogICAgICAgIGxhYnModGl0bGUgPSAiUGVyY2VudHVhbCBkZSBhY2VydG8geCBncnVwb3MgdGF4b25vbWljb3NcbiIsIAogICAgICAgICAgICAgeSA9ICJGcmVxdWVuY2lhIiwgeCA9ICJQZXJjZW50dWFsIGRlIGFjZXJ0byIpICsKICAgICAgICBteV90aGVtZQoKYGBgCgoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CmNpZGFkZTEgPC0gcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvW3Bvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRtdW5pY2lwaW8gPT0gIlNpbHbDom5pYSIsXQpjaWRhZGUyIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0b1twb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kbXVuaWNpcGlvID09ICJCZWxhIFZpc3RhIGRlIEdvacOhcyIsXQpncmlkLmFycmFuZ2UoCiAgICBwbG90QW5hbGlzZU1lZGlhcygKICAgICAgICBjaWRhZGUxJHBfaW5kaWNlX2V4b3RpY2FzLAogICAgICAgIGNpZGFkZTEkcF9pbmRpY2VfbmF0aXZhcywKICAgICAgICAiU2lsdsOibmlhIiksCiAgICBwbG90QW5hbGlzZU1lZGlhcygKICAgICAgICBjaWRhZGUyJHBfaW5kaWNlX2V4b3RpY2FzLAogICAgICAgIGNpZGFkZTIkcF9pbmRpY2VfbmF0aXZhcywKICAgICAgICAiQmVsYSBWaXN0YSBkZSBHb2nDoXMiLCB5dGV4dCA9ICIiKSwKICAgIG5jb2wgPSAyLAogICAgdG9wID0gdGV4dEdyb2IoIk5pdmVpcyBkZSByZWNvbmhlY2ltZW50byBwb3Igb3JpZ2VtXG4iLCAKICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpLAogICAgcmlnaHQgPSAiXG4iCikKYGBgCgpNZWRpbmRvIGFzIG3DqWRpYXMgZGUgYWNlcnRvIG5hIGlkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CiMgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvICU+JQojICAgICBncm91cF9ieShtdW5pY2lwaW8pICU+JQojICAgICBzdW1tYXJpc2UoZXhvdGljYXMgPSBtZWFuKHBfaW5kaWNlX2V4b3RpY2FzKSwKIyAgICAgICAgICAgICAgIG5hdGl2YXMgPSBtZWFuKHBfaW5kaWNlX25hdGl2YXMpKSAlPiUKIyAgICAgdW5ncm91cCgpICU+JQojICAgICBtZWx0KGlkID0gIm11bmljaXBpbyIpICU+JQojICAgICBnZ3Bsb3QoYWVzKG11bmljaXBpbywgdmFsdWUsIGZpbGwgPSB2YXJpYWJsZSkpICsKIyAgICAgZmFjZXRfd3JhcCh+dmFyaWFibGUpKwojICAgICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRikgKwojICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gaWMubWVkaWEodmFyaWFibGUpJGVycm9yX2luZmVyaW9yLCB5bWF4ID0gaWMubWVkaWEodmFyaWFibGUpJGVycm9yX3N1cGVyaW9yICkpICsKIyAgICAgbGFicyh0aXRsZSA9ICJNw6lkaWEgZGUgdGF4YSBkZSByZWNvbmhlY2ltZW50byBkYXMgb3JpZ2VucyBleMOzdGljYXMgcG9yIG11bmljaXBpb1xuIiwKIyAgICAgICAgICB4ID0gIiIsIHkgPSAiUGVyY2VudHVhbCBtw6lkaW8gZGUgYWNlcnRvXG4iKSArCiMgICAgIG15X3RoZW1lCmBgYAoKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTEuNX0KIyBiYXJwbG90KHRhcHBseSgKIyAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzLCAKIyAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJG11bmljaXBpbywKIyAgICAgbWVhbiksIG1haW4gPSAiTcOpZGlhIGRlIHRheGEgZGUgcmVjb25oZWNpbWVudG8gZGFzIG9yaWdlbnMgZXjDs3RpY2FzIHBvciBhcmVhcyIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9MS41fQojIGJhcnBsb3QodGFwcGx5KAojICAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMsIAojICAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kYXJlYSwKIyAgICAgbWVhbiksIG1haW4gPSAiTcOpZGlhIGRlIHRheGEgZGUgcmVjb25oZWNpbWVudG8gZGFzIG9yaWdlbnMgZXjDs3RpY2FzIHBvciBhcmVhcyIpCmBgYApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xLjV9CiMgYmFycGxvdCh0YXBwbHkoCiMgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9uYXRpdmFzLCAKIyAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJGFyZWEsCiMgICAgIG1lYW4pLCBtYWluID0gIk3DqWRpYSBkZSB0YXhhIGRlIHJlY29uaGVjaW1lbnRvIGRhcyBvcmlnZW5zIGV4w7N0aWNhcyBwb3IgYXJlYXMiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTEuOH0KYmFycGxvdCh0YXBwbHkoCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMsIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHR1cm1hcywKICAgIG1lYW4pLCBtYWluID0gIlxuTcOpZGlhIGRlIHRheGEgZGUgcmVjb25oZWNpbWVudG8gZGFzIG9yaWdlbnMgZXjDs3RpY2FzIHBvciB0dXJtYXNcbiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9MS44fQpiYXJwbG90KHRhcHBseSgKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9uYXRpdmFzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byR0dXJtYXMsCiAgICBtZWFuKSwgbWFpbiA9ICJcbk3DqWRpYSBkZSB0YXhhIGRlIHJlY29uaGVjaW1lbnRvIGRhcyBvcmlnZW5zIG5hdGl2YXMgcG9yIHR1cm1hc1xuIikKYGBgCgoKIyMjIFRlc3RlIGRlIG5vcm1hbGlkYWRlCgpQYXJhIGRldGVybWluYXIgYSBub3JtYWxpZGFkZSBuYXMgZGlzdHJpYnVpw6dvZXMgZGFzIHJlc3Bvc3RhcyBkbyBqb2dvIGRlIGltYWdlbnMuCgpgYGB7ciwgZWNobz1GQUxTRX0KZ3JhZmljb19kZW5zaWRhZGUgPC0gZnVuY3Rpb24odmFyaWF2ZWwsIGNvciwgdGl0dWxvKSB7CiAgICBwbG90IDwtIAogICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSAlPiUgCiAgICAgICAgZ2dkZW5zaXR5KHggPSB2YXJpYXZlbCwgZmlsbCA9IGNvciwKICAgICAgICAgIG1haW4gPSB0aXR1bG8sCiAgICAgICAgICB4bGFiID0gIlBlcmNlbnR1YWwgZGUgYWNlcnRvcyIpICsgCiAgICAgICAgeGxpbSgwLCAxKSArIAogICAgICAgIHlsaW0oMCwgOCkKICAgIG5vbWFsaWRhZGUgPC0gCiAgICAgICAgZ2d0ZXh0dGFibGUoCiAgICAgICAgICAgIG5vcm1hbGlkYWRlKHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYVtbdmFyaWF2ZWxdXSksIAogICAgICAgICAgICByb3dzID0gTlVMTCwgdGhlbWUgPSB0dGhlbWUoYmFzZV9zdHlsZSA9ICJtT3JhbmdlIiwgYmFzZV9zaXplID0gOCkKICAgICAgICApCiAgICAKICAgIHJlc3VsdGFkbyA8LSBsaXN0KAogICAgICAgIHBsb3QgPSBwbG90LAogICAgICAgIG5vcm1hbGlkYWRlID0gbm9tYWxpZGFkZQogICAgKQogICAgcmV0dXJuKHJlc3VsdGFkbykKfQoKdDEgPC0gZ3JhZmljb19kZW5zaWRhZGUoInBfbmF0aXZhcyIsICJncmVlbiIsICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIGRlIG9yaWdlbSBOYXRpdmFzIikKdDIgPC0gZ3JhZmljb19kZW5zaWRhZGUoInBfZXhvdGljYXMiLCAicmVkIiwgIklkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMgZGUgb3JpZ2VtIEV4w7N0aWNhcyIpCnQzIDwtIGdyYWZpY29fZGVuc2lkYWRlKCJwX29yaWdlbV9uYXRpdmFzIiwgImRhcmtncmVlbiIsICJJZGVudGlmaWNhw6fDo28gZGUgb3JpZ2VtIE5hdGl2YXMiKQp0NCA8LSBncmFmaWNvX2RlbnNpZGFkZSgicF9vcmlnZW1fZXhvdGljYXMiLCAiZGFya3JlZCIsICJJZGVudGlmaWNhw6fDo28gZGUgb3JpZ2VtIEV4w7N0aWNhcyIpCnQ1IDwtIGdyYWZpY29fZGVuc2lkYWRlKCJwX2luZGljZV9uYXRpdmFzIiwgIm9yYW5nZSIsICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8gTmF0aXZhcyAob3JpZ2VucyArIGVzcMOpY2llcykiKQp0NiA8LSBncmFmaWNvX2RlbnNpZGFkZSgicF9pbmRpY2VfZXhvdGljYXMiLCAib3JhbmdlcmVkIiwgIkluZGljZSBkZSByZWNvbmhlY2ltZW50byBFeMOzdGljYXMgKG9yaWdlbnMgKyBlc3DDqWNpZXMpIikKYGBgCgojIyMjIElkZW50aWZpY2HDp8OjbyBtw6lkaW8gZGFzIHR1cm1hcyAobm9tZXMgZGFzIGVzcMOpY2llcyAmIG9yaWdlbnMpCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD01fQpncmlkLmFycmFuZ2UodDEkcGxvdCwgdDIkcGxvdCwKICAgICAgICAgICAgIHQxJG5vcm1hbGlkYWRlLCB0MiRub3JtYWxpZGFkZSwKICAgICAgICAgICAgIHQzJHBsb3QsIHQ0JHBsb3QsCiAgICAgICAgICAgICB0MyRub3JtYWxpZGFkZSwgdDQkbm9ybWFsaWRhZGUsCiAgICAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgICAgIGhlaWdodHMgPSBjKDMsMiwzLDIpLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIkRlbnNpZGFkZSBkZSBpZGVudGlmaWNhw6fDo28gbcOpZGlhIGRhcyB0dXJtYXMgZW50cmUgXG5lc3BlY2llcyBlIHN1YXMgb3JpZ2Vuc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpCiAgICAgICAgICAgICApCmBgYAoKIyMjIyBJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8gbcOpZGlvIGRhcyB0dXJtYXMKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CmdyaWQuYXJyYW5nZSh0NSRwbG90LCB0NiRwbG90LAogICAgICAgICAgICAgdDUkbm9ybWFsaWRhZGUsIHQ2JG5vcm1hbGlkYWRlLAogICAgICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICAgICBoZWlnaHRzID0gYyg0LDMpLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIkRlbnNpZGFkZSBkb3MgaW5kaWNlcyBkZSByZWNvbmhlY2ltZW50byBtw6lkaW8gZGFzIHR1cm1hc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpCiAgICAgICAgICAgICApCmBgYAoKCiMjIyBRLVEgVGVzdAoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTR9CnFxcGxvdC5kYXRhIDwtIGZ1bmN0aW9uICh2ZWMsIHRpdHVsbykgewogICMgZm9sbG93aW5nIGZvdXIgbGluZXMgZnJvbSBiYXNlIFIncyBxcWxpbmUoKQogIHkgPC0gcXVhbnRpbGUodmVjWyFpcy5uYSh2ZWMpXSwgYygwLjI1LCAwLjc1KSkKICB4IDwtIHFub3JtKGMoMC4yNSwgMC43NSkpCiAgc2xvcGUgPC0gZGlmZih5KS9kaWZmKHgpCiAgaW50IDwtIHlbMUxdIC0gc2xvcGUgKiB4WzFMXQoKICBkIDwtIGRhdGEuZnJhbWUocmVzaWRzID0gdmVjKQoKICBnZ3Bsb3QoZCwgYWVzKHNhbXBsZSA9IHJlc2lkcykpICsgCiAgICAgIHN0YXRfcXEoKSArIAogICAgICBnZW9tX2FibGluZShzbG9wZSA9IHNsb3BlLCBpbnRlcmNlcHQgPSBpbnQsIGNvbCA9ICJyZWQiKSArCiAgICAgIHhsaW0oLTIsIDIpICsKICAgICAgeWxpbSgwLCAxKSArCiAgICAgIHRoZW1lX2J3KCkgKwogICAgICBsYWJzKAogICAgICAgIHRpdGxlID0gdGl0dWxvCiAgICApCn0KCnExIDwtIHFxcGxvdC5kYXRhKHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX25hdGl2YXMsICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIGRlIG9yaWdlbSBOYXRpdmFzIikKcTIgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfZXhvdGljYXMsICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIGRlIG9yaWdlbSBFeG90aWNhcyIpCnEzIDwtIHFxcGxvdC5kYXRhKHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX29yaWdlbV9uYXRpdmFzLCAiSWRlbnRpZmljYcOnw6NvIGRlIG9yaWdlbSBOYXRpdmFzIikKcTQgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX2V4b3RpY2FzLCAiSWRlbnRpZmljYcOnw6NvIGRlIG9yaWdlbSBFeG90aWNhcyIpCnE1IDwtIHFxcGxvdC5kYXRhKHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX2luZGljZV9uYXRpdmFzLCAiSW5kaWNlIGRlIHJlY29uaGVjaW1lbnRvIE5hdGl2YXMgKG9yaWdlbnMgKyBlc3DDqWNpZXMpIikKcTYgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfaW5kaWNlX2V4b3RpY2FzLCAiSW5kaWNlIGRlIHJlY29uaGVjaW1lbnRvIEV4b3RpY2FzIChvcmlnZW5zICsgZXNww6ljaWVzKSIpCgpncmlkLmFycmFuZ2UocTEsIHEyLCAKICAgICAgICAgICAgIHEzLCBxNCwKICAgICAgICAgICAgIHE1LCBxNiwKICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIk5vcm1hbCBRLVEgUGxvdFxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAyMCwgZm9udCA9IDIpKQogICAgICAgICAgICAgKQpgYGAKCiMjIyBUZXN0ZSBkZSB2YXJpw6JuY2lhCgpQYXJhIGRldGVybWluYXIgYSB2YXJpw6JuY2lhCgpgYGB7cn0KdmFyaWFuY2lhIDwtIGRhdGEuZnJhbWUoCiAgICBBbGdvcml0bW8gPSBjKCJGIHRlc3QgdG8gY29tcGFyZSB0d28gdmFyaWFuY2VzIiksCiAgICAiQ29tcGFyYcOnw6NvIiA9IGMoIk5hdGl2YXMgeCBFeMOzdGljYXMiKSwKICAgICJWYXJpw6F2ZWwiID0gYygKICAgICAgICAiSW5kaWNlIGRlIHJlY29uaGVjaW1lbnRvIiwKICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRvIG5vbWUgZGFzIGVzcMOpY2llcyIsCiAgICAgICAgIklkZW50aWZpY2HDp8OjbyBkYSBvcmlnZW0iCiAgICApLAogICAgInBfdmFsb3IiID0gYygKICAgICAgICB2YXIudGVzdChwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9pbmRpY2VfbmF0aXZhcywgCiAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfaW5kaWNlX2V4b3RpY2FzLCAKICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSRwLnZhbHVlLAogICAgICAgIHZhci50ZXN0KHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX25hdGl2YXMsIAogICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX2V4b3RpY2FzLCAKICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSRwLnZhbHVlLAogICAgICAgIHZhci50ZXN0KHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX29yaWdlbV9uYXRpdmFzLCAKICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9vcmlnZW1fZXhvdGljYXMsIAogICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpJHAudmFsdWUKICAgICkKKQoKdmFyaWFuY2lhIDwtIHZhcmlhbmNpYSAlPiUKICAgIG11dGF0ZSgKICAgICAgICB2YXJpYW5jaWEgPSBwX3ZhbG9yID4gMC4wNSwKICAgICAgICBwX3ZhbG9yID0gY2VsbF9zcGVjKHJvdW5kKHBfdmFsb3IsIDQpLCBib2xkID0gVCwgY29sb3IgPSAiYmxhY2siLCBhbGlnbiA9ICJyaWdodCIpLAogICAgICAgIHZhcmlhbmNpYSA9IGNlbGxfc3BlYyh2YXJpYW5jaWEsIGJvbGQgPSB2YXJpYW5jaWEsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9IGlmZWxzZSh2YXJpYW5jaWEsICJ3aGl0ZSIsICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gaWZlbHNlKHZhcmlhbmNpYSwgImdyZWVuIiwgIiNDQ0NDQ0MiKSkKICAgICkKCnZhcmlhbmNpYSAlPiUKICBrYWJsZShlc2NhcGUgPSBGKSAlPiUKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAlPiUKICBjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxOjIsIHZhbGlnbiA9ICJ0b3AiKSAKYGBgCgojIyMgQW5hbGlzZXMgZGVzY3JpdGl2YXMKCmBgYHtyfQpoZWFkKHBvc19nYWJhcml0byRlc3BlY2llcywgMTApCmBgYAoKIyMjIyBSZWNvbmhlY2ltZW50byBkbyBub21lIGRhcyBlc3BlY2llcwoKIyMjIyMgUG9yIG9yaWdlbQoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTZ9CnBvc19nYWJhcml0byRlc3BlY2llcyAlPiUgCiAgICBnZ3Bsb3QoYWVzKGVzcGVjaWVEZXNjLCBmciwgZmlsbCA9IGdydXBvKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChmciAqIDEwMCwgMSksICIlIikpLCAKICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gMC41LAogICAgICAgICAgICAgIGhqdXN0ID0gLTAuNSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxLjIpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X3dyYXAofm9yaWdlbSwgc2NhbGVzID0gImZyZWVfeSIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiUmVjb25oZWNpbWVudG8gZG8gbm9tZSBkYXMgZXNwZWNpZXMgcG9yIG9yaWdlbSIsCiAgICAgICAgIGZpbGwgPSAiR3J1cG9zIiwgeCA9ICIiLCB5ID0gIlxuRnJlcXVlbmNpYSByZWxhdGl2YSIpICsKICAgIG15X3RoZW1lCmBgYAoKIyMjIyMgUG9yIGVzcMOpY2llCgpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KcG9zX2dhYmFyaXRvJGVzcGVjaWVzICU+JSAKICAgIGdncGxvdChhZXMoZXNwZWNpZURlc2MsIGZyLCBmaWxsID0gb3JpZ2VtKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChmciAqIDEwMCwgMSksICIlIikpLCAKICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gMC41LAogICAgICAgICAgICAgIGhqdXN0ID0gLTAuMykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxLjIpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X3dyYXAofmdydXBvLCBzY2FsZXMgPSAiZnJlZV95IikgKwogICAgY29vcmRfZmxpcCgpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJSZWNvbmhlY2ltZW50byBkbyBub21lIGRhcyBlc3BlY2llcyBwb3IgZ3J1cG8gdGF4b27Ds21pY28iLAogICAgICAgICBmaWxsID0gIk9yaWdlbSIsIHggPSAiIiwgeSA9ICJcbkZyZXF1ZW5jaWEgcmVsYXRpdmEiKSArCiAgICBteV90aGVtZQpgYGAKCiMjIFRlc3RlcyBkZSBoaXBvdGVzZXMKCkVzcGVyYWRvIHAtdmFsb3IgPj0gMC4wNSBuYSBub3JtYWxpZGFkZSAoZXNwZXJhLXNlIEgwKQpFc3BlcmFkbyBwLXZhbG9yIDw9IDAuMDUgbm8gdGVzdGUgZGUgaGlwb3Rlc2UgKGVzcGVyYS1zZSBIMSkKClRhYmVsYSBkb3MgdGVzdGVzIGRlIGhpcG90ZXNlcyBhcGxpY2Fkb3MKCmBgYHtyfQp0MSA8LSB0LnRlc3QoCiAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25vbWVfZXhvdGljYXMsIAogICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9ub21lX25hdGl2YXMsIAogICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCBjb25mLmxldmVsID0gLjk1KQp0MiA8LSB0LnRlc3QoCiAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX29yaWdlbV9leG90aWNhcywgCiAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX29yaWdlbV9uYXRpdmFzLCAKICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSwgY29uZi5sZXZlbCA9IC45NSkKdDMgPC0gdC50ZXN0KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9uYXRpdmFzLCAKICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAuOTUpCnQxYiA8LSB3aWxjb3gudGVzdCgKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25vbWVfZXhvdGljYXMsIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9uYXRpdmFzLCAKICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUpCnQyYiA8LSB3aWxjb3gudGVzdCgKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX29yaWdlbV9leG90aWNhcywgCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9vcmlnZW1fbmF0aXZhcywgCiAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFKQp0M2IgPC0gd2lsY294LnRlc3QoCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMsIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMsIAogICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSkKZGF0YS5mcmFtZSgKICAgICJDb21wYXJhw6fDo28iID0gYygiRXjDs3RpY2FzIHggTmF0aXZhcyIpLAogICAgQWxnb3JpdG1vID0gYyh0MSRtZXRob2QsIHQyJG1ldGhvZCwgdDMkbWV0aG9kLCB0MWIkbWV0aG9kLCB0MmIkbWV0aG9kLCB0M2IkbWV0aG9kKSwKICAgICJWYXJpw6F2ZWwiID0gYygKICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRvIG5vbWUgZGFzIGVzcMOpY2llcyIsCiAgICAgICAgIklkZW50aWZpY2HDp8OjbyBkYSBvcmlnZW0iLAogICAgICAgICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8iCiAgICApLAogICAgcF92YWxvciA9IGModDEkcC52YWx1ZSwgdDIkcC52YWx1ZSwgdDMkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICB0MWIkcC52YWx1ZSwgdDJiJHAudmFsdWUsIHQzYiRwLnZhbHVlKSwKICAgIEgwID0gYyh0MSRwLnZhbHVlID49IDAuMDUsIHQyJHAudmFsdWUgPj0gMC4wNSwgdDMkcC52YWx1ZSA+PSAwLjA1LCAKICAgICAgICAgICB0MWIkcC52YWx1ZSA+PSAwLjA1LCB0MmIkcC52YWx1ZSA+PSAwLjA1LCB0M2IkcC52YWx1ZSA+PSAwLjA1KSwKICAgIEgxID0gYyh0MSRwLnZhbHVlIDwgMC4wNSwgdDIkcC52YWx1ZSA8IDAuMDUsIHQzJHAudmFsdWUgPCAwLjA1LAogICAgICAgICAgIHQxYiRwLnZhbHVlIDwgMC4wNSwgdDJiJHAudmFsdWUgPCAwLjA1LCB0M2IkcC52YWx1ZSA8IDAuMDUpLAogICAgIkNvbmZpYW7Dp2EiID0gYygKICAgICAgICBwYXN0ZShwYXN0ZTAocm91bmQodDEkY29uZi5pbnQgKiAxMDAsIDIpLCAiJSIpLCBjb2xsYXBzZSA9ICIgfiAiKSwKICAgICAgICBwYXN0ZShwYXN0ZTAocm91bmQodDIkY29uZi5pbnQgKiAxMDAsIDIpLCAiJSIpLCBjb2xsYXBzZSA9ICIgfiAiKSwKICAgICAgICBwYXN0ZShwYXN0ZTAocm91bmQodDMkY29uZi5pbnQgKiAxMDAsIDIpLCAiJSIpLCBjb2xsYXBzZSA9ICIgfiAiKSwKICAgICAgICAiLSIsCiAgICAgICAgIi0iLAogICAgICAgICItIgogICAgKQopICU+JQogIG11dGF0ZSgKICAgIHBfdmFsb3IgPSBjZWxsX3NwZWMocF92YWxvciwgYm9sZCA9IFQsIGNvbG9yID0gImJsYWNrIiwgYWxpZ24gPSAicmlnaHQiKSwKICAgIEgwID0gY2VsbF9zcGVjKEgwLCBib2xkID0gSDAsCiAgICAgICAgICAgICAgICAgICBjb2xvcj0gaWZlbHNlKEgwLCAid2hpdGUiLCAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gaWZlbHNlKEgwLCAiZ3JlZW4iLCAiI0NDQ0NDQyIpKSwKICAgIEgxID0gY2VsbF9zcGVjKEgxLCBib2xkID0gSDEsIAogICAgICAgICAgICAgICAgICAgY29sb3IgPSBpZmVsc2UoSDEsICJ3aGl0ZSIsICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBpZmVsc2UoSDEsICJncmVlbiIsICIjQ0NDQ0NDIikpCiAgKSAlPiUKICBrYWJsZShlc2NhcGUgPSBGKSAlPiUKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogIGNvbHVtbl9zcGVjKDIsIGJvbGQgPSBUUlVFKSAlPiUKICBjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxOjIsIHZhbGlnbiA9ICJ0b3AiKSAlPiUKICBmb290bm90ZShnZW5lcmFsID0gIkludGVydmFsbyBkZSBjb25maWFuw6dhIDk1JSIsCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICJcbk9icy46ICIsCiAgICAgICAgICAgZm9vdG5vdGVfYXNfY2h1bmsgPSBUKQpgYGAKCgojIyMgMSAtIE9zIGFsdW5vcyBpdGVuZGlmaWNhbSBtYWlzIG9zIG5vbWVzIGRvcyBhbmltYWlzIGRlIGVzcMOpY2llcyBleMOzdGljYXMgcXVlIG9zIGFuaW1haXMgZGUgZXNww6ljaWVzIG5hdGl2YXMuCgpSZXN1bHRhZG8gZG8gdGVzdGUgcGFyYW3DqXRyaWNvCgpgYGB7ciwgZWNobz1GQUxTRX0KdDEKYGBgClJlc3VsdGFkbyBkbyB0ZXN0ZSBuw6NvIHBhcmFtw6l0cmljbwoKYGBge3IsIGVjaG89RkFMU0V9CnQxYgpgYGAKCgojIyMgMiAtIE9zIGFsdW5vcyBpZGVudGlmaWNhbSBtYWlzIGVzcMOpY2llcyBkZSBvcmlnZW0gZXjDs3RpY2EgcXVlIGFzIGRlIG9yaWdlbSBuYXRpdmEuCgpSZXN1bHRhZG8gZG8gdGVzdGUgcGFyYW3DqXRyaWNvCgpgYGB7ciwgZWNobz1GQUxTRX0KdDIKYGBgCgpSZXN1bHRhZG8gZG8gdGVzdGUgbsOjbyBwYXJhbcOpdHJpY28KCmBgYHtyLCBlY2hvPUZBTFNFfQp0MmIKYGBgCgojIyMgMyAtIE9zIGFsdW5vcyBpZGVudGlmaWNhbSBtYWlzIGFzIGVzcMOpY2llcyBleMOzdGljYXMgKG5vbWUgZG9zIGFuaW1haXMgZSBvcmlnZW0pIHF1ZSBlc3DDqWNpZXMgbmF0aXZhcy4KClJlc3VsdGFkbyBkbyB0ZXN0ZSBwYXJhbcOpdHJpY28KCmBgYHtyLCBlY2hvPUZBTFNFfQp0MwpgYGAKClJlc3VsdGFkbyBkbyB0ZXN0ZSBuw6NvIHBhcmFtw6l0cmljbwoKYGBge3IsIGVjaG89RkFMU0V9CnQzYgpgYGAKCiMjIyA0IC0gT3MgYWx1bm9zIHJlY29uaGVjZW0gbWFpcyBtYW3DrWZlcm9zIGRvIHF1ZSBvcyBkZW1haXMgZ3J1cG9zIHRheG9uw7NtaWNvcy4KCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQpwbG90QW5hbGlzZVRheG9ub21pY29zR2Vub3ZhcnQoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zfQpncmlkLmFycmFuZ2UoCiAgICBwbG90QW5hbGlzZU1lZGlhcyhwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX2F2ZXMsCiAgICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9hdmVzLAogICAgICAgICAgICAgICAgICAiQXZlcyIsICJNw6lkaWEgcGVyY2VudHVhbCBkZSBhY2VydG9zXG4iLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcyksCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMpKSwKICAgIAogICAgcGxvdEFuYWxpc2VNZWRpYXMocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9pbnZlcnRlYnJhZG8sCiAgICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9pbnZlcnRlYnJhZG8sCiAgICAgICAgICAgICAgICAgICJJbnZlcnRlYnJhZG9zIiwgeSA9ICIiLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcyksCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMpKSwKICAgIAogICAgcGxvdEFuYWxpc2VNZWRpYXMocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9tYW1pZmVybywKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX21hbWlmZXJvLAogICAgICAgICAgICAgICAgICAiTWFtaWZlcm9zIiwgeSA9ICIiLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcyksCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMpKSwgCiAgICAKICAgIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfcGVpeGUsCiAgICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9wZWl4ZSwKICAgICAgICAgICAgICAgICAgIlBlaXhlcyIsIHkgPSAiIiwKICAgICAgICAgICAgICAgICAgbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMpLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9uYXRpdmFzKSksIAogICAgCiAgICBwbG90QW5hbGlzZU1lZGlhcyhwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX3JlcHRpbCwKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX3JlcHRpbCwKICAgICAgICAgICAgICAgICAgIlLDqXB0ZWlzIiwgeSA9ICIiLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcyksCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMpKSwgCiAgICBuY29sID0gNSwKICAgIHRvcCA9IHRleHRHcm9iKCJOaXZlaXMgZGUgcmVjb25oZWNpbWVudG8gcG9yIG9yaWdlbVxuIiwgCiAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAyMCwgZm9udCA9IDIpKSwKICAgIHJpZ2h0ID0gIlxuIgopCmBgYAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQp0bXAgPC0gcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvICU+JQogICAgc2VsZWN0KHBfZXhvdGljYV9hdmVzOnBfbmF0aXZhX3JlcHRpbCkgJT4lCiAgICBtZWx0KCkKIyBhbm92YShsbSh2YWx1ZSB+IHZhcmlhYmxlLCB0bXApKQoKdG1wIDwtIGNiaW5kKHRtcCwgY29sc3BsaXQodG1wJHZhcmlhYmxlLCAiXyIsIGMoInAiLCAib3JpZ2VtIiwgImdydXBvIikpKSAlPiUKICAgIHNlbGVjdChvcmlnZW0sIGdydXBvLCB2YWx1ZSkKCmFub3ZhKGxtKHZhbHVlIH4gZ3J1cG8gKiBvcmlnZW0sIHRtcCkpCmBgYAoKYGBge3J9CnR1a2V5IDwtIFR1a2V5SFNEKGFvdihsbSh2YWx1ZSB+IGdydXBvICogb3JpZ2VtLCB0bXApKSkKdHVrZXkKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9N30KdGt5IDwtIGFzLmRhdGEuZnJhbWUodHVrZXkkYGdydXBvOm9yaWdlbWApCnRreSA8LSB0a3kgJT4lCiAgbXV0YXRlKHBhaXIgPSByZW9yZGVyKHJvd25hbWVzKHRreSksIGBkaWZmYCksCiAgICAgICAgIHNpZ25pZmNhbnRlID0gKGBwIGFkamAgPD0gMC4wNSksCiAgICAgICAgIGNvciA9IGlmZWxzZShgcCBhZGpgIDw9IDAuMDUsICJyZWQiLCAiYmxhY2siKSkKCmdncGxvdCh0a3ksIGFlcyhjb2xvdXIgPSBjdXQoYHAgYWRqYCwgYygwLCAwLjA1LCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGMoIlNpZ25pZmljYW50ZSIsICJOw6NvIHNpZ25pZmljYW50ZSIpKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbHR5PSIxMSIsIGNvbG91cj0iZ3JleTMwIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHBhaXIsIHltaW49bHdyLCB5bWF4PXVwciksIHdpZHRoPTAuNSwgc2l6ZT0xKSArCiAgZ2VvbV9wb2ludChhZXMocGFpciwgZGlmZiksIHNpemU9Mywgc2hhcGU9MjEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicmVkIiwgImJsYWNrIikpKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnModGl0bGUgPSAiR3J1cG8gdGF4b27Ds21pY28geCBPcmlnZW0gZGFzIGVzcMOpY2llcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJBbsOhbGlzZSBUdWtleSIsCiAgICAgICBjb2xvdXIgPSAiIiwgeCA9ICJDb21wYXJhw6fDo28gZGUgZ3J1cG9zIiwgeSA9ICJcbkRpZmVyZW7Dp2EgZW50cmUgYXMgbcOpZGlhcyIpCmBgYAoKIyMjIDUgLSBFc3R1ZGFudGVzIHF1ZSByZXNpZGVtIG5hIENpZGFkZSAxIChjb20gVUMpIGlkZW50aWZpY2FtIG1haXMgZXNww6ljaWVzIG5hdGl2YXMgZG8gcXVlIGVzdHVkYW50ZXMgcXVlIHJlc2lkZW0gbmEgQ2lkYWRlIDIgKHNlbSBVQykuCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChtdW5pY2lwaW8sIHBfbm9tZV9leG90aWNhczpwX2luZGljZV9uYXRpdmFzKQp0LnRlc3QocF9pbmRpY2VfbmF0aXZhcyB+IG11bmljaXBpbywgdG1wKQpgYGAKCiMjIyA2IC0gRXN0dWRhbnRlcyBxdWUgcmVzaWRlbSBlbSDDoXJlYSBydXJhbCB0ZW0gbWFpb3IgY29uaGVjaW1lbnRvIHNvYnJlIGFzIGVzcMOpY2llcyBuYXRpdmFzLgoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnRtcCA8LSBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8gJT4lCiAgICBzZWxlY3QoYXJlYSwgcF9ub21lX2V4b3RpY2FzOnBfaW5kaWNlX25hdGl2YXMpCnQudGVzdChwX2luZGljZV9uYXRpdmFzIH4gYXJlYSwgdG1wKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0yLjV9CnRtcCA8LSBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8gJT4lCiAgICBzZWxlY3QoYXJlYSwgcF9ub21lX2V4b3RpY2FzOnBfaW5kaWNlX25hdGl2YXMpICU+JQogICAgbWVsdCgiYXJlYSIpCnRtcCA8LQogICAgY2JpbmQodG1wLCBjb2xzcGxpdCh0bXAkdmFyaWFibGUsICJfIiwgYygicCIsICJpbmRpY2Fkb3IiLCAib3JpZ2VtIikpKSAlPiUKICAgIHNlbGVjdChhcmVhLCBpbmRpY2Fkb3IsIG9yaWdlbSwgdmFsdWUpCnRtcCAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYm94cGxvdChhZXMoeCA9IGFyZWEsIHkgPSB2YWx1ZSwgZmlsbCA9IG9yaWdlbSksIHNob3cubGVnZW5kID0gVCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBmYWNldF93cmFwKH5pbmRpY2Fkb3IpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgaWRlbnRpZmljYcOnw6NvIGRlIGVzcMOpY2llcyBOYXRpdmFzIG5vcyBjcml0w6lyaW9zIGVzdGFiZWxlY2lkb3MiLAogICAgICAgeSA9ICJQZXJjZW50dWFsIGRlIGlkZW50aWZpY2HDp8OjbyIsIHggPSAiIikgKwogIG15X3RoZW1lCmBgYAoKIyMjIDcgLSBGcmVxdWVuY2lhIGRlIGNvbnRhdG8gbmF0dXJlemEKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0yLjV9CnRtcCA8LSBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8gJT4lCiAgICBzZWxlY3QoZnJlcXVlbmNpYSwgcF9ub21lX2V4b3RpY2FzOnBfaW5kaWNlX25hdGl2YXMpICU+JQogICAgbWVsdChpZCA9ICJmcmVxdWVuY2lhIikKCnRtcCA8LQogICAgY2JpbmQodG1wLCBjb2xzcGxpdCh0bXAkdmFyaWFibGUsICJfIiwgYygicCIsICJpbmRpY2Fkb3IiLCAib3JpZ2VtIikpKSAlPiUKICAgIHNlbGVjdChmcmVxdWVuY2lhLCBpbmRpY2Fkb3IsIG9yaWdlbSwgdmFsdWUpCgp0bXAgJT4lCiAgZ2dwbG90KCkgKyAKICBnZW9tX2JveHBsb3QoYWVzKHggPSBvcmlnZW0sIHkgPSB2YWx1ZSwgZmlsbCA9IGZyZXF1ZW5jaWEpLCBzaG93LmxlZ2VuZCA9IFQpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgZmFjZXRfd3JhcCh+aW5kaWNhZG9yKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlIGlkZW50aWZpY2HDp8OjbyBkZSBlc3DDqWNpZXMgTmF0aXZhcyBub3MgY3JpdMOpcmlvcyBlc3RhYmVsZWNpZG9zIiwKICAgICAgIHkgPSAiUGVyY2VudHVhbCBkZSBpZGVudGlmaWNhw6fDo28iLCB4ID0gIiIpICsKICBteV90aGVtZQpgYGAKCmBgYHtyfQphbm92YShsbSh2YWx1ZSAgfiBmcmVxdWVuY2lhLCBkYXRhID0gdG1wICU+JSBmaWx0ZXIoaW5kaWNhZG9yID09ICJpbmRpY2UiKSkpCiNUdWtleUhTRChhb3YobG0odmFsdWUgIH4gZnJlcXVlbmNpYSwgZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGluZGljYWRvciA9PSAiaW5kaWNlIikpKSkKYGBgCgojIyMgOCAtIEZleiBhdWxhcyBwcmF0aWNhcwoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTIuNX0KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChmZXouYXVsYSwgcF9ub21lX2V4b3RpY2FzOnBfaW5kaWNlX25hdGl2YXMpICU+JQogICAgbWVsdChpZCA9ICJmZXouYXVsYSIpCgp0bXAgPC0KICAgIGNiaW5kKHRtcCwgY29sc3BsaXQodG1wJHZhcmlhYmxlLCAiXyIsIGMoInAiLCAiaW5kaWNhZG9yIiwgIm9yaWdlbSIpKSkgJT4lCiAgICBzZWxlY3QoZmV6LmF1bGEsIGluZGljYWRvciwgb3JpZ2VtLCB2YWx1ZSkKCnRtcCAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYm94cGxvdChhZXMoeCA9IG9yaWdlbSwgeSA9IHZhbHVlLCBmaWxsID0gZmV6LmF1bGEpLCBzaG93LmxlZ2VuZCA9IFQpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgZmFjZXRfd3JhcCh+aW5kaWNhZG9yKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlIGlkZW50aWZpY2HDp8OjbyBkZSBlc3DDqWNpZXMgTmF0aXZhcyBub3MgY3JpdMOpcmlvcyBlc3RhYmVsZWNpZG9zIiwKICAgICAgIHkgPSAiUGVyY2VudHVhbCBkZSBpZGVudGlmaWNhw6fDo28iLCB4ID0gIiIpICsKICBteV90aGVtZQpgYGAKCmBgYHtyfQphbm92YShsbSh2YWx1ZSAgfiBmZXouYXVsYSwgZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGluZGljYWRvciA9PSAiaW5kaWNlIikpKQojVHVrZXlIU0QoYW92KGxtKHZhbHVlICB+IGZyZXF1ZW5jaWEsIGRhdGEgPSB0bXAgJT4lIGZpbHRlcihpbmRpY2Fkb3IgPT0gImluZGljZSIpKSkpCmBgYAoKIyMjIDkgLSBFc3R1ZGFudGVzIGRlIFNpbHZhbmlhIHF1ZSB2aXNpdGFtIGEgVUMgdGVtIG1haW9yIHByb3BvcsOnw6NvIGRlIGFjZXJ0b3MgZXNww6ljaWVzIG5hdGl2YXMuCgpgYGB7cn0KdG1wIDwtIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvICU+JQogICAgZmlsdGVyKG11bmljaXBpbyA9PSAiU2lsdsOibmlhIikgJT4lCiAgICBzZWxlY3QoZmxvbmEsIHBfaW5kaWNlX25hdGl2YXMpCiNub3JtYWxpZGFkZSh0bXAkcF9pbmRpY2VfbmF0aXZhcykKdC50ZXN0KHBfaW5kaWNlX25hdGl2YXMgfiBmbG9uYSwgdG1wKQpgYGAKCiMjIyAxMCAtIFJhbmtpbmcgZG9zIGFuaW1haXMKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00fQphMSA8LSAKICAgIHBvc19nYWJhcml0byRyYWtpbmdfYW5pbWFpcyRuYXRpdm9zICU+JQogICAgaGVhZCgyMCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBhbmltYWlzLCB5ID0gZnJlcSwgZmlsbCA9IGZyZXEpKSArCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZyZXEpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gLTEsIGhqdXN0ID0gMC41KSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDkwKSkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAib3JhbmdlIiwgaGlnaCA9ICJyZWQiKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiRXNww6ljaWVzIGNpdGFkYXMgY29tbyBuYXRpdmFzIiwKICAgICAgIHkgPSAiRnJlcXVlbmNpYSIsIHggPSAiIikgKwogICAgbXlfdGhlbWUKYTIgPC0gCiAgICBwb3NfZ2FiYXJpdG8kcmFraW5nX2FuaW1haXMkZXhvdGljb3MgJT4lCiAgICBoZWFkKDIwKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGFuaW1haXMsIHkgPSBmcmVxLCBmaWxsID0gZnJlcSkpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZnJlcSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAtMSwgaGp1c3QgPSAwLjUpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsOTApKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJsaWdodGJsdWUiLCBoaWdoID0gImRhcmtibHVlIikgKwogICAgdGhlbWVfYncoKSArCiAgICBsYWJzKHRpdGxlID0gIkVzcMOpY2llcyBjaXRhZGFzIGNvbW8gZXjDs3RpY2FzIiwKICAgICAgIHkgPSAiRnJlcXVlbmNpYSIsIHggPSAiIikgKwogICAgbXlfdGhlbWUKCmdyaWQuYXJyYW5nZShhMSwgYTIsCiAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgIHRvcCA9IHRleHRHcm9iKCJUT1AgMjAgLSBSYW5raW5nIGRhcyBlc3DDqWNpZXMgY2l0YWRhcyBjb21vIGV4ZW1wbG9cbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSkKKQpgYGAKCiMjIyAxMSAtIFJhbmtpbmcgZG9zIGFuaW1haXMgY2l0YWRvcyBwYXJhIHByb3Rlw6fDo28KCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0yfQphMyA8LSAKICAgIHBvc19nYWJhcml0byRyYWtpbmdfYW5pbWFpcyRwcm90ZWdpZG9zICU+JQogICAgaGVhZCgyMCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBhbmltYWlzLCB5ID0gZnJlcSwgZmlsbCA9IGZyZXEpKSArCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZyZXEpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gLTEsIGhqdXN0ID0gMC41KSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE5MCkpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZWVuIiwgaGlnaCA9ICJkYXJrZ3JlZW4iKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiRXNww6ljaWVzIGNpdGFkYXMgY29tbyBuYXRpdmFzIiwKICAgICAgIHkgPSAiRnJlcXVlbmNpYSIsIHggPSAiIikgKwogICAgbXlfdGhlbWUKCmdyaWQuYXJyYW5nZShhMywKICAgICAgICAgICAgIHRvcCA9IHRleHRHcm9iKCJUT1AgMjAgLSBSYW5raW5nIGRhcyBlc3DDqWNpZXMgY2l0YWRhcyBjb21vIGV4ZW1wbG8gcGFyYSBwcm90ZcOnw6NvXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpCikKYGBgCgo=